package org.snake.exam.eg.locksupport;

import java.util.concurrent.locks.LockSupport;

public class NormalCallPark {

    public static void main(String[] args) throws InterruptedException {
        Thread busThreadJim = new Thread(() -> {

            System.out.println("参数检查...");
            System.out.println("执行业务逻辑...");
            System.out.println("进入状态同步点");
            LockSupport.park("因为可能原因A而阻塞住线程");

            System.out.println("同步点完成,进步业务收尾阶段...");
            System.out.println("进入最后一个同步点结束");
            LockSupport.park("报告这个线程当前的工作程度或者状态xxxx");

            System.out.println("业务逻辑完成退出");
        });
        busThreadJim.start();

        System.out.println("控制线程或者监控线程开始做其他逻辑...");
        Thread.sleep(2000);
        System.out.println("检查工作线程是否阻塞住,为什么:" + LockSupport.getBlocker(busThreadJim));
        LockSupport.unpark(busThreadJim);

        // 如果线程调度慢 LockSupport.getBlocker获取到null
        // 也就是说工作线程还没有阻塞住
        System.out.println("可以通过阻塞对象来传出一些线程工作信息:" + LockSupport.getBlocker(busThreadJim));
        System.out.println("当然共享变量也是可以的");
        LockSupport.unpark(busThreadJim);

        System.out.println("逻辑完成");
    }
}
